package com.tebiecloud.mpweixin.server.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.tebiecloud.common.constants.ResultEnum;
import com.tebiecloud.common.model.PageParams;
import com.tebiecloud.common.model.ResultBody;
import com.tebiecloud.common.utils.JsonUtils;
import com.tebiecloud.common.utils.ResultBodyUtils;
import com.tebiecloud.common.utils.StringUtils;
import com.tebiecloud.mpweixin.client.model.entity.MpweixinQrcode;
import com.tebiecloud.mpweixin.client.model.mpweixin.QrcodeTicket;
import com.tebiecloud.mpweixin.server.properties.MpweixinProperties;
import com.tebiecloud.mpweixin.server.service.MpweixinQrcodeService;
import com.tebiecloud.mpweixin.server.service.feign.MpopenApiServiceClient;
import com.tebiecloud.mpweixin.server.utils.MPApi;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RestController;
import java.util.Arrays;
import java.util.Date;
import java.util.Map;

/**
 * 公众号生成的二维码 前端控制器
 * @author tebie
 * @date 2019-09-10
 */
@Slf4j
@RestController
@RequestMapping("/mpweixinqrcode")
public class MpweixinQrcodeController {

    @Autowired
    private MpweixinProperties mpweixinProperties;

    @Autowired
    private MpweixinQrcodeService mpweixinQrcodeService;

    @Autowired
    private MpopenApiServiceClient mpopenApiServiceClient;

    /**
     * 创建二维码
     * @param data QrcodeParam类对应的json字符串
     * @return
     */
    @PostMapping("createQrcode")
    public ResultBody<QrcodeTicket> createQrcode(@RequestParam("data") String data) {
        String appid = mpweixinProperties.getAppid();
        QrcodeTicket qrcodeTicket = getQrcodeTicket(appid, data, false);
        if(qrcodeTicket != null && MPApi.isInvalueToken(qrcodeTicket.getErrcode())) {
            log.info("access_token无效，重新获取");
            qrcodeTicket = getQrcodeTicket(appid, data, true);
        }

        if(qrcodeTicket != null && !StringUtils.isEmpty(qrcodeTicket.getUrl())) { // access_token无效，重新获取
//            MpweixinQrcode entity = new MpweixinQrcode();
//            entity.setAppid(appid);
//            if(qrcodeTicket.getExpire_seconds() > 0) {
//                entity.setExpireTime(new Date(System.currentTimeMillis() + qrcodeTicket.getExpire_seconds() * 1000));
//            }
//            entity.setActionName(qrcodeTicket.get);
//            entity.setScene(scene);
//            entity.setUrl(url);
//            mpweixinQrcodeService.save(entity);

            return ResultBodyUtils.ok(qrcodeTicket);
        }

        log.info("生成微信二维码失败");
        return ResultBodyUtils.failed();
    }

    /**
     * 获取微信二维码
     * @param appid
     * @param data
     * @param force
     * @return
     */
    private QrcodeTicket getQrcodeTicket(String appid, String data, boolean force) {
        ResultBody<String> respAccessToekn = mpopenApiServiceClient.getWxapiAccessToken(appid, force);
        if(respAccessToekn.getCode() != ResultEnum.OK.getCode()) {
            log.info("生成微信二维码失败, respAccessToekn: {}", JsonUtils.Obj2Str(respAccessToekn));
            return null;
        }
        String access_token = respAccessToekn.getData();
        String resp = MPApi.qrcodeCreate(access_token, data);
        QrcodeTicket qrcodeTicket = JsonUtils.str2Bean(resp, QrcodeTicket.class);
        if(qrcodeTicket != null) {
            return qrcodeTicket;
        }

        return null;
    }

//    /**
//     * 获取分页数据
//     * @param map
//     * @return
//     */
//    @GetMapping(value = "list")
//    public ResultBody<IPage<MpweixinQrcode>> list(@RequestParam(required = false) Map map) {
//        PageParams pageParams = new PageParams(map);
//        MpweixinQrcode query = pageParams.mapToObject(MpweixinQrcode.class);
//        QueryWrapper<MpweixinQrcode> queryWrapper = new QueryWrapper();
//        return ResultBodyUtils.ok(mpweixinQrcodeService.page(new PageParams(map), queryWrapper));
//    }
//
//    /**
//     * 根据ID查找数据
//     * @param id
//     * @return
//     */
//    @GetMapping("get")
//    public ResultBody<MpweixinQrcode> get(@RequestParam("id") Long id) {
//        MpweixinQrcode entity = mpweixinQrcodeService.getById(id);
//        return ResultBodyUtils.ok(entity);
//    }
//
//    /**
//     * 添加数据
//     * @param appid 对应公众号appid,
//     * @param expireTime 二维码过期时间,
//     * @param actionName 二维码类型，QR_SCENE为临时的整型参数值，QR_STR_SCENE为临时的字符串参数值，QR_LIMIT_SCENE为永久的整型参数值，QR_LIMIT_STR_SCENE为永久的字符串参数值,
//     * @param scene 场景值,
//     * @param url 二维码图片解析后的地址，开发者可根据该地址自行生成需要的二维码图片
//     * @return
//     */
//    @PostMapping("add")
//    public ResultBody add(
//        @RequestParam(value = "appid", required = false) String appid,
//        @RequestParam(value = "expireTime", required = false) Date expireTime,
//        @RequestParam(value = "actionName", required = false) String actionName,
//        @RequestParam(value = "scene", required = false) String scene,
//        @RequestParam(value = "url", required = false) String url
//    ) {
//        MpweixinQrcode entity = new MpweixinQrcode();
//        entity.setAppid(appid);
//        entity.setExpireTime(expireTime);
//        entity.setActionName(actionName);
//        entity.setScene(scene);
//        entity.setUrl(url);
//        mpweixinQrcodeService.save(entity);
//        return ResultBodyUtils.ok();
//    }
//
//    /**
//     * 更新数据
//     * @param appid 对应公众号appid
//     * @param expireTime 二维码过期时间
//     * @param actionName 二维码类型，QR_SCENE为临时的整型参数值，QR_STR_SCENE为临时的字符串参数值，QR_LIMIT_SCENE为永久的整型参数值，QR_LIMIT_STR_SCENE为永久的字符串参数值
//     * @param scene 场景值
//     * @param url 二维码图片解析后的地址，开发者可根据该地址自行生成需要的二维码图片
//     * @return
//     */
//    @PostMapping("update")
//    public ResultBody update(
//            @RequestParam(value = "id", required = false) Long id,
//            @RequestParam(value = "appid", required = false) String appid,
//            @RequestParam(value = "expireTime", required = false) Date expireTime,
//            @RequestParam(value = "actionName", required = false) String actionName,
//            @RequestParam(value = "scene", required = false) String scene,
//            @RequestParam(value = "url", required = false) String url
//    ) {
//        MpweixinQrcode entity = new MpweixinQrcode();
//        entity.setId(id);
//        entity.setAppid(appid);
//        entity.setExpireTime(expireTime);
//        entity.setActionName(actionName);
//        entity.setScene(scene);
//        entity.setUrl(url);
//        mpweixinQrcodeService.updateById(entity);
//        return ResultBodyUtils.ok();
//    }
//
//    /**
//     * 删除数据
//     * @param id 单个id
//     * @param ids 多个id用,号隔开
//     * @return
//     */
//    @PostMapping("remove")
//    public ResultBody remove(
//            @RequestParam(value = "id", required = false) Long id,
//            @RequestParam(value = "ids", required = false) String ids
//    ) {
//        if(id != null && id > 0) {
//            mpweixinQrcodeService.removeById(id);
//        }
//        if(ids != null && ids.length() > 0) {
//            mpweixinQrcodeService.removeByIds(Arrays.asList(ids.split(",")));
//        }
//        return ResultBodyUtils.ok();
//    }

}
